package edu.uoc.tds.pec4.vista;

import edu.uoc.tds.pec4.model.SS1_CentroDocente;
import edu.uoc.tds.pec4.model.SS1_Universidad;
import edu.uoc.tds.pec4.util.ExceptionUtils;
import edu.uoc.tds.pec4.util.LanguageUtils;
import edu.uoc.tds.pec4.vista.base.JPanelBase;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.table.DefaultTableModel;

/**
 * Tecnicas de Desarrollo de Software - (UOC)
 *
 * @author Grupo Magicsoftware
 * @version 1.0
 */
public class SS1_PanelConsultaCentrosDocentes extends JPanelBase {
    private SS4_PantallaMenu padre;
    private JButton jb_buscar;
    private JButton jb_estado;
    private JButton jb_editar;
    private JButton jb_cancelar;
    private ArrayList<JLabel> labels;
    private ArrayList<JTextField> textfields;
    private JRadioButton rb_desacSi;
    private JRadioButton rb_desacNo;
    private ButtonGroup bg_desac;
    private JComboBox jcb_univer;
    private List<SS1_Universidad> universidades;
    private List<String> nombresUniversidades;
    private JTable tabla;
    private List<SS1_CentroDocente> centrosTabla;

    public SS1_PanelConsultaCentrosDocentes(SS4_PantallaMenu padre) {
        super(new BorderLayout());
        this.padre = padre;
        iniciarComponentes();
    }

    private void iniciarComponentes(){
        jb_buscar = new JButton(LanguageUtils.getMessage
                ("SS1.Buscar"));
        jb_buscar.setFocusable(false);
        jb_editar = new JButton(LanguageUtils.getMessage
                ("SS1.Editar"));
        jb_editar.setFocusable(false);
        jb_estado = new JButton(LanguageUtils.getMessage
                ("SS1.Estado"));
        jb_estado.setFocusable(false);
        jb_cancelar = new JButton(LanguageUtils.getMessage
                ("SS1.Cancelar"));
        jb_cancelar.setFocusable(false);
        JPanel pSur = new JPanel();
        pSur.add(jb_editar);
        pSur.add(jb_estado);
        pSur.add(jb_cancelar);
        add(pSur, BorderLayout.SOUTH);

        labels = new ArrayList<JLabel>();
        for (int i = 0; i < 6;i++){
            JLabel l = new JLabel(LanguageUtils.getMessage
                ("SS1_PanelCC.label" + i));
            l.setFocusable(false);
            labels.add(l);
        }

        textfields = new ArrayList<JTextField>();
        for (int i = 0; i < 4;i++){
            JTextField tf = new JTextField();
            tf.setText("");
            tf.setColumns(5);
            textfields.add(tf);
        }

        rb_desacSi = new JRadioButton(LanguageUtils.getMessage
                ("SS1.Si"));
        rb_desacSi.setFocusable(false);
        rb_desacSi.setSelected(true);
        rb_desacNo = new JRadioButton(LanguageUtils.getMessage
                ("SS1.No"));
        rb_desacNo.setFocusable(false);
        bg_desac = new ButtonGroup();
        bg_desac.add(rb_desacSi);
        bg_desac.add(rb_desacNo);
        try {
            universidades = padre.getRemotoMantenimiento().getUniversidades();
        } catch (SQLException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_SQL"));
        } catch (RemoteException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        }
        nombresUniversidades = new ArrayList<String>();
        for (int i = 0;i < universidades.size();i++) {
            nombresUniversidades.add(universidades.get(i).getNombre());
        }
        jcb_univer = new JComboBox(nombresUniversidades.toArray());
        jcb_univer.addItem(LanguageUtils.getMessage("SS1_PanelCC.Cualquiera"));
        jcb_univer.setSelectedIndex(nombresUniversidades.size());
        jcb_univer.setFocusable(false);

        String[][] filas = new String[8][4];
        tabla = new JTable(filas, getNombresColumnas());
        tabla.setCellSelectionEnabled(false);
        JScrollPane scrollPane = new JScrollPane(tabla);
        scrollPane.setPreferredSize(new Dimension(600, 200));
        scrollPane.setVerticalScrollBarPolicy
                (ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);

        JPanel pCentro = new JPanel();
        JPanel pDatos = new JPanel(new GridLayout(4, 1));
        ArrayList<JPanel> paneles = new ArrayList<JPanel>();
        for (int i = 0; i < 4; i++) {
            paneles.add(new JPanel());
        }

        paneles.get(0).add(labels.get(0));
        paneles.get(0).add(jcb_univer);
        paneles.get(0).add(labels.get(1));
        paneles.get(0).add(textfields.get(0));
        paneles.get(0).add(labels.get(2));
        paneles.get(0).add(textfields.get(1));
        paneles.get(1).add(labels.get(3));
        paneles.get(1).add(textfields.get(2));
        paneles.get(1).add(labels.get(4));
        paneles.get(1).add(textfields.get(3));
        paneles.get(2).add(labels.get(5));
        paneles.get(2).add(rb_desacSi);
        paneles.get(2).add(rb_desacNo);
        paneles.get(3).add(jb_buscar);

        for (int i = 0; i < paneles.size(); i++) {
            pDatos.add(paneles.get(i));
        }
        pCentro.add(pDatos);
        pCentro.add(scrollPane);
        add(pCentro, BorderLayout.CENTER);
        jb_buscar.addActionListener(padre);
        jb_editar.addActionListener(padre);
        jb_estado.addActionListener(padre);
        jb_cancelar.addActionListener(padre);
    }

    @Override
    public void componentePulsado(ActionEvent e) {
        if (e.getSource() == jb_buscar){
            configurarTabla();

        } else if (e.getSource() == jb_editar){
            editarTabla();

        } else if (e.getSource() == jb_estado){
            int[] r = tabla.getSelectedRows();

            for (int i = 0;i < r.length; i++) {
                if (r[i] < centrosTabla.size()){
                    SS1_CentroDocente centro = centrosTabla.get(i);
                    centro.setActivo(!centro.isActivo());
                    try {
                        padre.getRemotoMantenimiento().updateCentroDocente(centro.getId(), centro);
                    } catch (SQLException ex) {
                        ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_SQL"));
                    } catch (RemoteException ex) {
                        ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
                    }
                }
            }
            jb_buscar.doClick();

        } else if (e.getSource() == jb_cancelar){
            padre.setPanelCentral(new SS4_PanelInicial());
        }
    }

    private void configurarTabla(){
        DateFormat df = new SimpleDateFormat("dd/mm/yyyy");
        String condicion = "";
        String aux;

        if (jcb_univer.getSelectedIndex() != nombresUniversidades.size()){
            condicion = condicion.concat("cod_Universidad=");
            aux = "" + universidades.get(jcb_univer.getSelectedIndex()).getId();
            condicion = condicion.concat("'" + aux + "'");
        }
        aux = textfields.get(0).getText();
        if (!aux.equals("")) {
            if (!condicion.equals("")) condicion = condicion.concat(" AND ");
            condicion = condicion.concat("nombre=");
            condicion = condicion.concat("'" + aux + "'");
        }
        aux = textfields.get(1).getText();
        if (!aux.equals("")) {
            if (!condicion.equals("")) condicion = condicion.concat(" AND ");
            condicion = condicion.concat("codigo_postal=");
            condicion = condicion.concat("'" + aux + "'");
        }
        aux = textfields.get(2).getText();
        if (!aux.equals("")) {
            try {
                df.parse(aux);
            } catch (ParseException ex) {
                ExceptionUtils.visualizarInformacion(LanguageUtils.getMessage("SS1_Mensaje7"));
                return;
            }
            if (!condicion.equals("")) condicion = condicion.concat(" AND ");
            condicion = condicion.concat("fecha_alta>=");
            condicion = condicion.concat("'" + aux + "'");
        }
        aux = textfields.get(3).getText();
        if (!aux.equals("")) {
            try {
                df.parse(aux);
            } catch (ParseException ex) {
                ExceptionUtils.visualizarInformacion(LanguageUtils.getMessage("SS1_Mensaje7"));
                return;
            }
            if (!condicion.equals("")) condicion = condicion.concat(" AND ");
            condicion = condicion.concat("fecha_alta<=");
            condicion = condicion.concat("'" + aux + "'");
        }
        if (rb_desacNo.isSelected()) {
            if (!condicion.equals("")) condicion = condicion.concat(" AND ");
            condicion = condicion.concat("activo='1'");
        }

        try {
             centrosTabla = padre.getRemotoMantenimiento().getCentrosDocentes(condicion);
        } catch (SQLException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_SQL"));
        } catch (RemoteException ex) {
            ExceptionUtils.visualizarError(LanguageUtils.getMessage("ERR_Remote"));
        }

        String[][] filas = new String[centrosTabla.size()][4];
        for (int i = 0; i < centrosTabla.size(); i++) {
            SS1_CentroDocente centro = centrosTabla.get(i);
            filas[i][0] = centro.getNombre();
            filas[i][1] = centro.getUniversidad().getNombre();
            filas[i][2] = centro.getLocalidad();
            if (centro.isActivo()) filas[i][3] = LanguageUtils.getMessage("SS1.Si");
            else filas[i][3] = LanguageUtils.getMessage("SS1.No");
        }
        tabla.setModel(new DefaultTableModel(filas, getNombresColumnas()));
    }

    private void editarTabla(){
        int i = tabla.getSelectedRow();

        if (i != -1 && centrosTabla != null){
            if (i < centrosTabla.size()){
                SS1_CentroDocente centro = centrosTabla.get(i);
                SS1_PanelGestionarCentroDocente PanelGC =
                        new SS1_PanelGestionarCentroDocente(padre);
                PanelGC.setConsulta(this);
                PanelGC.setCentro(centro);
                padre.setPanelCentral(PanelGC);
            }
        }
    }

    private String[] getNombresColumnas(){
        String[] nombresColumnas = {
            LanguageUtils.getMessage("SS1_PanelCC.Centro"),
            LanguageUtils.getMessage("SS1_PanelCC.Universidad"),
            LanguageUtils.getMessage("SS1_PanelCC.Localidad"),
            LanguageUtils.getMessage("SS1_PanelCC.Activo")
        };
        return nombresColumnas;
    }
}
